package heuristic;

import es.deusto.ingenieria.is.search.algorithms.Node;
import es.deusto.ingenieria.is.search.algorithms.heuristic.EvaluationFunction;
import formulation.Environment;

public class HanoiTowerEvaluationFunction extends EvaluationFunction
{

	@Override
	public double calculateG(Node arg0)
	{
		return 0;
	}

	@Override
	public double calculateH(Node arg0)
	{
		Environment environment = (Environment) arg0.getState();
		
//		Heuristica 1: Numero de discos que quedan en el soporte de la izquierda
		return environment.getSoportes().get(environment.getSoporteInicial() - 1).getDiscos().size();
		
//		Heuristica 2: Numero de discos que hay en el soporte de la izquierda más el número de discos que hay en el soporte central
//		return environment.getNumDiscos() - environment.getSoportes().get(environment.getSoporteFinal() - 1).getDiscos().size();

//		Heuristica 3: Numero de discos que hay en el soporte de la derecha
//		return this.getHeuristica3(environment);

	}
	
	public int getHeuristica3(Environment environment)
	{

		int penal = 1;
		int sop = 0;
		int numDisc = environment.getNumDiscos();
		//Buscamos el soporte que contiene el disco más grande, si está en el soporte final, la penalización será de 0, sino será de 1
		for (sop = 0; sop < environment.getSoportes().size(); sop++)
		{
			if (!environment.getSoportes().get(sop).getDiscos().isEmpty())
			{
				if (environment.getSoportes().get(sop).getDiscos().get(0).getSize() != numDisc)
				{
					if (sop == environment.getSoporteFinal())
					{
						penal = 0;
					}
					break;
				}
			}
		}
		if (penal == 1)
		{
			int discFin = environment.getSoportes().get(environment.getSoporteFinal() - 1).getDiscos().size(); //Num de discos en el soporte final
			int discGra = environment.getSoportes().get(sop).getDiscos().size() - 1; //Num de discos sobre el disco más grande
			penal = penal + discGra - discFin;
		}

		return penal;
	}
}
